package javaLearning.IO集合;

import java.lang.reflect.Field;

/**
 * 通过反射修改 String（final修饰）
 *
 * @author : K k
 * @date : 17:45 2020/10/11
 */
public class StringDemo {
    public static void main(String[] args) {
        String res=new String("lll");
        print(res);
        System.out.println(res);
    }

    public static void printA(String res){
        //由于形参和实参 指向的都是同一引用  即A->地址res  B->地址res  地址res->String缓存池中的"lll"
        res="xxx";//生成新的String对象
        //若在此处修改，B->新地址res2  新地址res2->String缓存池中的"xxx"
        //所以原来的参数res不会改变值。
    }

    public static void print(String res){
        //通过暴力反射修改
        Class<? extends String> aClass = res.getClass();
        try {
            Field value = aClass.getDeclaredField("value");
            value.setAccessible(true);
            char[] o = (char[]) value.get(res);
            for (int i=0;i<o.length;i++){
                o[i]='x';
            }
            System.out.println(res);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
